﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using Gman.WebApp.ServiceControllers;
using Gman.Entity.Entities;
using System.Web.Caching;
using System.Web.UI;
using Gman.WebApp.Controllers.Base;
using Gman.WebApp.Models;
using Gman.WebApp.Models.Validator;

namespace Gman.WebApp.Controllers
{
    public class TransferenciaActivoController : BaseController
    {

        private OperacionServiceController service = new OperacionServiceController();

        //
        // GET: /TransferenciaActivo/Search
        public ActionResult Search()
        {
            var cache = new CacheProvider();
            TransferenciaActivosBE transActivo = new TransferenciaActivosBE();

            var model = new TransferenciaActivoModel(transActivo);
            cache.Set(model.ID.Value.ToString(), model);

            model.Action = "search";
            model.ToolBar = new ToolBarModel();

            return View(@"~/Views/TransferenciaActivo/Edit.aspx", model);

        }

        // GET: /TransferenciaActivo/Create
        public ActionResult Create()
        {
            var cache = new CacheProvider();
            TransferenciaActivosBE transActivo = new TransferenciaActivosBE();

            var model = new TransferenciaActivoModel(transActivo);
            cache.Set(model.ID.Value.ToString(), model);
            model.Action = "create";
            model.ToolBar = new ToolBarModel();

            return View(@"~/Views/TransferenciaActivo/Edit.aspx", model);
        }



        public ViewResult LoadAddOrEditActivos(Guid id, Guid? activoGuid)
        {
            var cache = new CacheProvider();
            TransferenciaActivoDetalleModel activo = null;
            if (!activoGuid.HasValue)
            {
                activo = new TransferenciaActivoDetalleModel(new TransferenciaActivoDetalleBE());
                activo.Action = "create";
                cache.Set(activo.ID.Value.ToString(), activo);
            }
            else
            {
                var activoModel = GetTransActivoModel(id);
                activo = activoModel.TransActivoDetalles.FirstOrDefault(x => x.ID == activoGuid.Value);
                activo.Action = "edit";
                if (activo.TransActivoDetalle.IDTransfer.HasValue)
                {
                    cache.Set(activoGuid.ToString(), activo);
                }
            }
            return View(@"~/Views/TransferenciaActivoDetalle/AddOrEditDetalleTrans.ascx", activo);
        }

        public TransferenciaActivoModel GetTransActivoModel(Guid id)
        {
            var cache = new CacheProvider();

            string key = id.ToString();
            var existingModel = cache.Get(key);
            if (existingModel == null)
            {
                existingModel = new TransferenciaActivoModel(new TransferenciaActivosBE());
                cache.Set(key, existingModel);
            }
            return (TransferenciaActivoModel)existingModel;
        }

        public ActionResult UpdateField(string fieldName, string fieldValue, Guid id, string setterFormatOptions)
        {
            TransferenciaActivoModel model = GetTransActivoModel(id);
            SetterFormatOptions setterFormatOptionsEnum = SetterFormatOptionsHelper.Parse(setterFormatOptions);
            List<KeyValuePair<string, string>> validationList = new List<KeyValuePair<string, string>>();

            var setter = new PropertySetter<TransferenciaActivoModel>.SetterOptions();
            setter.objectToSet = model;
            setter.property = fieldName;
            setter.val = fieldValue;
            setter.SetterFormatOptions = setterFormatOptionsEnum;
            setter.validationList = validationList;

            object valueWasSet = PropertySetter<TransferenciaActivoModel>.SetFinalObject(setter);


            validationList.AddRange(new TransActivoModelValidator().Validate(model));

            return Json
                (new
                {
                    result = true,
                    PropertyValidationList = validationList,
                }
                );
        }

        public ActionResult GetValidation(Guid id)
        {
            TransferenciaActivoModel model = GetTransActivoModel(id);
            List<KeyValuePair<string, string>> validationList = new List<KeyValuePair<string, string>>();
            List<KeyValuePair<string, string>> propertyChangeList = new List<KeyValuePair<string, string>>();

            validationList.AddRange(new TransActivoModelValidator().Validate(model));

            return Json(new
            {
                PropertyValidationList = validationList,
                PropertyVisibilityList = propertyChangeList
            });
        }

        public JsonResult AddOrEditActivo(Guid id, Guid activoGuid, string action)
        {
            try
            {
                var activo = new TransferenciaActivoDetalleController().GetTransActivoDetalleModel(activoGuid);
                var model = GetTransActivoModel(id);
                bool estado = true;
                if (action == "create")
                {
                    if (model.TransActivoDetalles.Count >= 1)
                    {


                        foreach (var existe in model.TransActivoDetalles)
                        {
                            if (activo.BajaActivoDetalle.Bien.IDBien == existe.Bien.IDBien)
                            {
                                estado = false;
                            }

                            if (activo.BajaActivoDetalle.Bien.IDBien == existe.BajaActivoDetalle.Bien.IDBien)
                            {
                                estado = false;
                            }

                        }

                        if (estado)
                        {
                            activo.TransActivoDetalle.IDTransfer = 0;
                            model.TransActivoDetalles.Add(activo);
                        }

                    }
                    else
                    {
                        activo.TransActivoDetalle.IDTransfer = 0;
                        model.TransActivoDetalles.Add(activo);
                    }
                        
                }

                else if (action == "edit")
                {
                    var activoToEdit = model.TransActivoDetalles.FirstOrDefault(x => x.ID == activoGuid);
                    activoToEdit = activo;
                }

                return AjaxResultSuccessNoParam();
            }
            catch (Exception ex)
            {
                return AjaxResultError(ex.Message);
            }
        }

        public ViewResult GetListaActivo(Guid id)
        {
            TransferenciaActivoModel model = GetTransActivoModel(id);
            return View(@"~/Views/TransferenciaActivo/ListaTransActivoDetalle.ascx", model);
        }


        public JsonResult Save(Guid id, string action)
        {
            try
            {
                UsuariosBE user = (UsuariosBE)Session["user"];
                TransferenciaActivoModel model = GetTransActivoModel(id);
                TransferenciaActivosBE obj = new TransferenciaActivosBE();

                List<TransferenciaActivoDetalleBE> ListTrans = new List<TransferenciaActivoDetalleBE>();
                foreach (var transferencias in model.TransActivoDetalles)
                {
                    transferencias.TransActivoDetalle.IDBien = transferencias.BajaActivoDetalle.Bien.IDBien;
                    ListTrans.Add(transferencias.TransActivoDetalle);
                }

                List<TransferenciaActivoDetalleBE> Listeliminados = new List<TransferenciaActivoDetalleBE>();
                foreach (var eliminados in model.toDelete)
                {
                    Listeliminados.Add(eliminados.TransActivoDetalle);
                }
                

                if (model.Action == "create")
                {
                    
                    TransferenciaActivosBE transActivo = new TransferenciaActivosBE();
                    transActivo = model.TransActivo;
                    transActivo.NroTransfer = "TRF" + (service.ListarTransferenciaActivo(obj).Count + 1);
                    transActivo.UsuReg = user.NomUsu;
                    transActivo.TermCnxReg = Environment.MachineName;
                    transActivo.IDEmp = user.IDEmp;

                    int codTrans = service.RegistrarTransferenciaActivo(transActivo,ListTrans);

                    if (codTrans >= 1)
                    {
                        TempData["IDTransfer"] = codTrans;
                        return AjaxResultSuccess(string.Format("Transferencia de Activo {0} se guardo exitosamente.", transActivo.NroTransfer));
                    }
                    else
                    {
                        return AjaxResultSuccess(string.Format("No se guardo exitosamente."));
                    }

                }
                if (model.Action == "edit")
                {
                    TransferenciaActivosBE transActivo = new TransferenciaActivosBE();
                    transActivo = model.TransActivo;
                    transActivo.fecMod = DateTime.Now;
                    transActivo.TermCnxMod = Environment.MachineName;
                    transActivo.UsuMod = user.NomUsu;

                    int codTrans = service.ActualizarTransferenciaActivo(transActivo, ListTrans, Listeliminados);

                    if (codTrans >= 1)
                    {
                        TempData["IDTransfer"] = codTrans;
                        return AjaxResultSuccess(string.Format("Transferencia {0} se actualizo exitosamente.", transActivo.NroTransfer));

                    }
                    else
                    {
                        return AjaxResultSuccess(string.Format("No se guardo exitosamente."));
                    }
                }


                
                return AjaxResultSuccessNoParam();

            }
            catch (Exception ex)
            {
                return AjaxResultError(ex.Message);
            }
        }


        // POST: /TransferenciaActivo/DoSearch   
        public ActionResult DoSearch(string cod)
        {
            var cache = new CacheProvider();

            TransferenciaActivosBE obj = new TransferenciaActivosBE();
            obj.NroTransfer = cod;

            var transActivo = service.ObtenerTransferenciaActivo(obj);
            if (transActivo != null)
            {
                var model = new TransferenciaActivoModel(transActivo);
                cache.Set(model.ID.Value.ToString(), model);
                model.Action = "query";
                model.ToolBar = new ToolBarModel();

                Int64 IDTransfer = Convert.ToInt64(model.TransActivo.IDTransfer);
                TempData["IDTransfer"] = IDTransfer;

                model.TransActivoDetalles = new List<TransferenciaActivoDetalleModel>();

                IList<TransferenciaActivoDetalleBE> listaTransActivoDetalles = new List<TransferenciaActivoDetalleBE>();
                TransferenciaActivoDetalleBE transferencias = new TransferenciaActivoDetalleBE();
                transferencias.IDTransfer = Convert.ToInt64(TempData["IDTransfer"]);
                listaTransActivoDetalles = service.ListarTransferenciaActivoDetalle(transferencias);

                foreach (TransferenciaActivoDetalleBE transActivos in listaTransActivoDetalles)
                {

                    IList<BienBE> listaBienes = new List<BienBE>();
                    BienBE bien = new BienBE();
                    bien.IDEmp = 1;
                    listaBienes = service.ListarBien(bien);

                    foreach (BienBE bienes in listaBienes)
                    {
                        if (bienes.IDBien == transActivos.IDBien)
                        {
                            model.TransActivoDetalles.Add(new TransferenciaActivoDetalleModel(bienes, transActivos));
                        }
                    }


                }

                return View(@"~/Views/TransferenciaActivo/Edit.aspx", model);
            }

            return AjaxResultSuccess(string.Format("No se encontró baja de activo :{0} ", cod));
        }


        // POST: /TransferenciaActivo/Edit   
        public ActionResult Edit(string cod)
        {
            var cache = new CacheProvider();

            TransferenciaActivosBE obj = new TransferenciaActivosBE();
            obj.NroTransfer = cod;

            var transActivo = service.ObtenerTransferenciaActivo(obj);
            if (transActivo != null)
            {
                var model = new TransferenciaActivoModel(transActivo);
                cache.Set(model.ID.Value.ToString(), model);
                model.Action = "edit";
                model.ToolBar = new ToolBarModel();

                Int64 IDTransfer = Convert.ToInt64(model.TransActivo.IDTransfer);
                TempData["IDTransfer"] = IDTransfer;

                model.TransActivoDetalles = new List<TransferenciaActivoDetalleModel>();

                IList<TransferenciaActivoDetalleBE> listaTransActivoDetalles = new List<TransferenciaActivoDetalleBE>();
                TransferenciaActivoDetalleBE transferencias = new TransferenciaActivoDetalleBE();
                transferencias.IDTransfer = Convert.ToInt64(TempData["IDTransfer"]);
                listaTransActivoDetalles = service.ListarTransferenciaActivoDetalle(transferencias);

                foreach (TransferenciaActivoDetalleBE transActivos in listaTransActivoDetalles)
                {
                    //model.BajaActivoDetalles.Add(new BajaActivoDetalleModel(bajasActivos));

                    IList<BienBE> listaBienes = new List<BienBE>();
                    BienBE bien = new BienBE();
                    bien.IDEmp = 1;
                    listaBienes = service.ListarBien(bien);

                    foreach (BienBE bienes in listaBienes)
                    {
                        if (bienes.IDBien == transActivos.IDBien)
                        {
                            model.TransActivoDetalles.Add(new TransferenciaActivoDetalleModel(bienes, transActivos));
                        }
                    }


                }

                return View(@"~/Views/TransferenciaActivo/Edit.aspx", model);
            }

            return AjaxResultSuccess(string.Format("No se encontró baja de activo :{0} ", cod));
        }



        public ViewResult DeleteActivo(Guid id, Guid activoGuid)
        {
            var model = GetTransActivoModel(id);
            var activo = model.TransActivoDetalles.FirstOrDefault(x => x.ID == activoGuid);

            model.TransActivoDetalles.Remove(activo);

            if (model.Action == "edit" && activo.TransActivoDetalle.IDTransfer > 0)
            {
                model.toDelete.Add(activo);
            }

            return View(@"~/Views/TransferenciaActivo/ListaTransActivoDetalle.ascx", model);
        }

    }
}
